こういうコードがありました。
items.Add(new SimpleMenuItem("掲示板を読む [未読" + BBS.Get未読Count() + "件]", readbbs));
items.Add(new SimpleMenuItem("掲示板 全未読一気読み", readbbsIkki));
ここで、readbbsとreadbbsIkkiはどちらもメソッドです。
しかし、この2つはほとんど同じなので、1つのメソッドにまとめたいと思いました。
一気読みするか否かをbool引数で渡すようにしたいと思いますが、SimpleMenuItemのコンストラクタの第2引数のデリゲート型には引数の定義がありません。まあ、定義があっても渡しようが無いですけどね。このメソッドを呼ぶのはSimpleMenuItemのインスタンスであって、このコードが書かれたメソッドではありませんから。
ではどう書き直せば良い?
一瞬、簡潔に書けないか……と思いそうになりましたが、よく考えると小さな匿名メソッドを1つ挟めば簡単に解決できることに気付きました。
items.Add(new SimpleMenuItem("掲示板を読む [未読" + BBS.Get未読Count() + "件]",
delegate() { return readbbs(false); }));
items.Add(new SimpleMenuItem("掲示板 全未読一気読み",
delegate() { return readbbs(true); }));
あまりにシンプルな解決策なので、我ながら半信半疑で書いてみたら意図通りに通りました。
うーん、こんなコーディングに慣れたら、もう匿名メソッド/関数の無い言語には戻れない身体になってしまいそう……。
余談・論よりソース §
オータムマガジンを見ていれば分かると思いますが、最近もうオータムマガジンで理屈を語っていません。なぜかといえば、言葉でいくら理屈を語ったところで、それは本当の意味での説得力にならないと思うからです。本当なら、言葉を語るよりもソースを書くべきなのですが、この10年ほどはどうしても上手くソースを書けませんでした。しかし、今は書けます。なので、能書きを垂れてる時間があればコードを書く……という原則をやっと実践できるようになってきました。
というわけで、この文章は理屈を述べるものではなく、ちょっと冴えた良いソース(と自分が思ったもの)を他人に見せたくなったから書いたものなのです。